// ==UserScript==
// @name         New Userscript
// @namespace    http://tampermonkey.net/
// @version      2024-11-26
// @description  try to take over the world!
// @author       You
// @match        https://live.bilibili.com/25638333?live_from=82002&spm_id_from=333.1007.top_right_bar_window_dynamic.content.click
// @icon         https://www.google.com/s2/favicons?sz=64&domain=bilibili.com
// @run-at       document-start
// ==/UserScript==

(function () {
    'use strict';
    // 保存原始的WebSocket构造函数
    var originalWebSocket = WebSocket;

    // 定义新的WebSocket构造函数
    function HookedWebSocket(url, protocols) {
        // 调用原始的WebSocket构造函数
        var socket = new originalWebSocket(url, protocols);
        // 返回新的WebSocket实例
        // unsafeWindow.socketTest01 = socket;
        return createWebSocketProxy(socket);
    }

    // 继承原型链
    HookedWebSocket.prototype = originalWebSocket.prototype;

    // 替换全局的WebSocket构造函数
    unsafeWindow.WebSocket = HookedWebSocket;
    // Your code here...
    function createWebSocketProxy(ws) {

        const handler = {
            get(target, prop) {
              if (prop === 'readyState') {
                return target[prop]; // 直接返回 readyState 属性
              }
              const value = target[prop];
              if (typeof value === 'function') {
                return function(...args) {
                  return value.apply(target, args); // 确保函数在其原始上下文中被调用
                };
              }
              return value;
            },
            set(target, prop, value) {
              if (['onopen', 'onmessage', 'onclose', 'onerror'].includes(prop)) {
                console.log(`Setting ${prop} event handler`);
                //将原方法增加一个新增断点信息的
                target[prop] = function(event) {
                  console.log(`Event fired: ${prop}`, event);
                  if (typeof value === 'function') {
                    value.call(this, event); // 使用 call 绑定正确的 this 上下文
                  }
                }.bind(value); // 确保包装函数中的 this 是原始函数的 this
                return true; // 返回 true 表示赋值成功
              }
              target[prop] = value;
              return true;
            }
          };

        return new Proxy(ws, handler);
    }

})();